/**
 * 
 */
package kr.pe.johnkim.dayve.activity;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.chart.BarChart.Type;
import org.achartengine.model.CategorySeries;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.SimpleSeriesRenderer;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.json.JSONException;

import com.facebook.android.Facebook;

import kr.pe.johnkim.dayve.provider.DayveCategory;
import kr.pe.johnkim.dayve.provider.DayveCategoryAnalysisAdapter;
import kr.pe.johnkim.dayve.provider.DayveCategoryDatabaseHandler;
import kr.pe.johnkim.dayve.provider.DayveFavoriteDatabaseHandler;
import kr.pe.johnkim.dayve.provider.DayveGroup;
import kr.pe.johnkim.dayve.provider.DayveGroupDatabaseHandler;
import kr.pe.johnkim.dayve.provider.DayveItem;
import kr.pe.johnkim.dayve.provider.DayveItemDatabaseHandler;
import kr.pe.johnkim.dayve.provider.DayveLog;
import kr.pe.johnkim.dayve.provider.FacebookConstant;
import kr.pe.johnkim.dayve.rest.DayveCategoryRest;
import kr.pe.johnkim.dayve.rest.DayveCommonRest;
import kr.pe.johnkim.dayve.util.DayveCommon;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.DataSetObserver;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Paint.Align;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemSelectedListener;

/**
 * Category 분석 화면을 출력하는 클래스이다.
 * 
 * @author johnkim
 *
 */
public class DayveCategoryAnalysisView extends ListActivity {
	public static final String TAG = DayveCategoryAnalysisView.class.getSimpleName();
	
	// 프로그레스 바.
	ProgressBar analysisCategoryProgressBar;
	
	// 현재 시간.
	private String currentDate;
	
//	LinearLayout linearLayoutCategoryAnalysisGroupName;
//	LinearLayout linearLayoutCategoryAnalysisGroupNameEdit;
	LinearLayout linearLayoutCategoryAnalysisCommon;
	LinearLayout linearLayoutCategoryAnalysisEdit;
	LinearLayout linearLayoutCategoryAnalysisCategoryComment;
	LinearLayout linearLayoutCategoryAnalysisCategoryCommentEdit;
	LinearLayout linearLayoutAnalysisCategory;
	LinearLayout linearLayoutAnalysisCategoryUpper;
	
//	Spinner spinnerCategoryAnalysisSelectGroup;
	
	// Category Icon
	ImageView imgViewCategoryAnalysisCategoryIcon;
	
	// Category Icon Select
	ImageView imgViewCategoryAnalysisCategoryIconSelect;
	
	// 수정.
	ImageView imgViewCategoryAnalysisEdit;
	
	// 아이템 생성 버튼.
	ImageView imgViewMenuRegister;
	
	// Facebook 업로드 버튼.
	ImageView imgViewFacebook;
	
	// 삭제.
	ImageView imgViewCategoryAnalysisDelete;
	
	// 저장.
	ImageView imgViewCategoryAnalysisSave;
	
	// 뒤로(취소).
	ImageView imgViewCategoryAnalysisBack;
	
	// 즐겨 찾기 Yes.
	ImageView imgViewAnalysisCategoryFavoriteY;
	
	// 즐겨 찾기 No.
	ImageView imgViewAnalysisCategoryFavoriteN;
	
	// Group Name.
	TextView txtViewCategoryAnalysisGroupName;
	
	// 수정 모드일때 Category Name 출력.
	TextView txtViewAnalysisCategoryNameEdit;
	
	// Category Name.
	TextView txtViewAnalysisCategoryName;
	
	// Category Comment.
	TextView txtViewAnalysisCategoryComment;
	
	// Category Comment 입력 란.
	EditText edtTextCategoryAnalysisCategoryComment;
	
	// Category Name 입력 란.
//	EditText edtTextCategoryAnalysisName;
	
	// Category Comment 입력 란.
	EditText edtTextCategoryAnalysisComment;
	
	// Adapter Class.
	private DayveCategoryAnalysisAdapter dayveCategoryAnalysisAdapter;
	
	// 데이터 저장용 item 목록
	private ArrayList<DayveItem> itemList = null;
	
	// 화면 출력용 item 목록
	private ArrayList<DayveItem> itemViewList = null;
	
	private int position;
	private String categoryId;
	private String categoryName;
	private String categoryComment;
	public static String categoryIconUrl;
	private String openCategoryYn;
	private String favoriteYn;
	private String groupUnit;
	private String groupUnitTime;
	
	private String DAYVE_ID;
	
	DayveCategoryRest dayveCategoryRest = new DayveCategoryRest();
	DayveCommonRest dayveCommonRest = new DayveCommonRest();
	DayveCommon dayveCommon = new DayveCommon();
	
	Facebook facebook = new Facebook(FacebookConstant.FACEBOOK_APP_ID);

	// 로그를 저장한다.
	private static final int THREAD_INSERT_LOG = 100;
	
	// 프로그레스 바를 출력 한다.
	private static final int THREAD_PROGRESS_BAR_VISIBLE = 101;
	
	// 프로그레스 바를 감춘다.
	private static final int THREAD_PROGRESS_BAR_INVISIBLE = 102;
	
	// item 목록을 가져 와서 출력 한다.
	private static final int THREAD_CATEGORY_ITEM_LIST = 103;
	
	// item 목록을 업데이트 한다.
	private static final int THREAD_CATEGORY_ITEM_REFRESH = 104;
	
	// 목록 가져오기에 성공하면 Toast 를 띄운다.
	private static final int THREAD_CATEGORY_ITEM_LIST_SUCCESS = 105;
	
	// 목록 가져오기에 실패하면 Dialog 를 띄운다.
	private static final int THREAD_CATEGORY_ITEM_LIST_FAIL = 106;
	
	// Category 를 수정 한다.
	private static final int THREAD_CATEGORY_UPDATE = 107;
	
	// Category 수정에 성공하면 toast 를 띄운다.
	private static final int THREAD_CATEGORY_UPDATE_SUCCESS = 108;
	
	// Category 수정에 실패하면 dialog 창을 띄운다.
	private static final int THREAD_CATEGORY_UPDATE_FAIL = 109;
	
	// Category 를 비활성화 한다.
	private static final int THREAD_CATEGORY_DEACTIVATE = 110;
	
	// Category 비활성화에 성공하면 toast 를 띄운다.
	private static final int THREAD_CATEGORY_DEACTIVATE_SUCCESS = 111;
	
	// Category 비활성화에 실패하면 dialog 창을 띄운다.
	private static final int THREAD_CATEGORY_DEACTIVATE_FAIL = 112;
	
	// Category Analysis Graph 를 출력 한다.
	private static final int THREAD_CATEGORY_ALAYSIS_GRAPH = 113;
	
	// Category Analysis Graph layout 을 출력 한다.
	private static final int THREAD_CATEGORY_ALAYSIS_GRAPH_VISIBLE = 114;
	
	// Category Analysis Graph layout 을 감춘다.
	private static final int THREAD_CATEGORY_ALAYSIS_GRAPH_INVISIBLE = 115;
	
	// Facebook 으로 포스팅 한다.
	private static final int THREAD_FACEBOOK_POSTING = 116;
	
	// Category 즐겨 찾기 상태를 변경 한다.
	private static final int THREAD_UPDATE_CATEGORY_FAVORITE = 117;
	
	// Category 즐겨 찾기 상태 변경에 성공하면 toaset 를 띄운다.
	private static final int THREAD_UPDATE_CATEGORY_FAVORITE_SUCCESS = 118;
	
	// Category 즐겨 찾기 상태 변경에 실패하면 dialog 를 띄운다.
	private static final int THREAD_UPDATE_CATEGORY_FAVORITE_FAIL = 119;
	
	// Group DatabaseHandler
//	private DayveGroupDatabaseHandler groupDatabaseHandler;

	// Category DatabaesHandler
	private DayveCategoryDatabaseHandler categoryDatabaseHandler;

	// Item DatabaseHandler
	private DayveItemDatabaseHandler itemDatabaseHandler;

	// Favorite DatabaseHandler
	private DayveFavoriteDatabaseHandler favoriteDatabaseHandler;

	// Cursor Where Query
	private static final String WHERE_CATEGORY_ITEM = "";
	
	// 한번에 가져올 item 목록의 갯수. 스크롤 이벤트가 없으므로 한번에 다 가져 온다.
	private int itemCount = 1000000;

	// Group name.
	private String DAYVE_GROUP_NAME = "";

	// Group id.
	private String DAYVE_GROUP_ID = "";
	
	// Category 수정 결과.
	private String RESULT_UPDATE_CATEGORY = "";
	
	// Catetgory 비활성화 결과.
	private String RESULT_DEACTIVE_CATEGORY = "";
	
	// Item 등록 결과.
	public static String RESULT_ITEM_REGISTER = "";
	
	// Spinner 파라메터로 사용할 group name.
	public String SPINNER_GROUP_NAME = "";
	
	// Spinner group name position.
	public int SPINNER_GROUP_NAME_POSITION = 0;
	
	// 호출한 부모 Activity Name.
	private String PARENT_ACTIVITY_NAME = "";
	
	DayveFacebookView dayveFacebookView = new DayveFacebookView();
	
	private String FACEBOOK_CONTENT = "";
	private String FACEBOOK_LINK = "";
	
	public static String RESULT_FACEBOOK_POSTING = "";
	
	public static String ACTIVITY_RESULT = "";
	
	// 즐겨 찾기 상태 여부를 확인 한다.
	private String CATEGORY_FAVORITE_YN = "";
	private String CATEGORY_FAVORITE_YN_CONPARE = "";
	
	private String MODE = "";
	
	public static Activity activity;

	/* (non-Javadoc)
	 * @see android.app.Activity#onCreate(android.os.Bundle)
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.dayve_category_analysis);
		
		activity = this;
		
		analysisCategoryProgressBar = (ProgressBar)findViewById(R.id.analysisCategoryProgressBar);
		
		Intent i = getIntent();
		
		position = i.getIntExtra("position", 0);
		categoryId = i.getStringExtra("idMyHistoryCategories");
		categoryName = i.getStringExtra("name");
		categoryComment = i.getStringExtra("comment");
		categoryIconUrl = i.getStringExtra("iconUrl");
		openCategoryYn = i.getStringExtra("openCategoryYn");
		favoriteYn = i.getStringExtra("favoriteYn");
		DAYVE_ID = i.getStringExtra("myHistoryMembersId");
		DAYVE_GROUP_ID = i.getStringExtra("groupId");
		
		PARENT_ACTIVITY_NAME = i.getStringExtra("parent_activity_name");
		
		CATEGORY_FAVORITE_YN = favoriteYn;
		CATEGORY_FAVORITE_YN_CONPARE = favoriteYn;
		
		// DatabaseHandler 를 연다.
//		dbHandler = DatabaseHandler.open(getApplicationContext());
//		groupDatabaseHandler = DayveGroupDatabaseHandler.open(getApplicationContext());
		
		
		
//		itemDatabaseHandler = DayveItemDatabaseHandler.open(getApplicationContext());
		
		// 현재 시간을 가져 온다.
		currentDate = dayveCommon.getCurrentDate();
		
//		linearLayoutCategoryAnalysisGroupName = (LinearLayout)findViewById(R.id.linearLayoutCategoryAnalysisGroupName);
		
//		linearLayoutCategoryAnalysisGroupNameEdit = (LinearLayout)findViewById(R.id.linearLayoutCategoryAnalysisGroupNameEdit);
		
		linearLayoutCategoryAnalysisCommon = (LinearLayout)findViewById(R.id.linearLayoutCategoryAnalysisCommon);
		
		linearLayoutCategoryAnalysisEdit = (LinearLayout)findViewById(R.id.linearLayoutCategoryAnalysisEdit);
		
		linearLayoutCategoryAnalysisCategoryComment = (LinearLayout)findViewById(R.id.linearLayoutCategoryAnalysisCategoryComment);
		
		linearLayoutCategoryAnalysisCategoryCommentEdit = (LinearLayout)findViewById(R.id.linearLayoutkCategoryAnalysisCatgegoryCommentEdit);
		
		linearLayoutAnalysisCategory = (LinearLayout)findViewById(R.id.linearLayoutAnalysisCategory);
		
		linearLayoutAnalysisCategoryUpper = (LinearLayout)findViewById(R.id.linearLayoutAnalysisCategoryUpper);
		
		linearLayoutAnalysisCategoryUpper.setBackgroundColor(Color.DKGRAY);
		
		// 처음 화면이 출력되면 맨 위에 일반 아이콘이 보이며, 저장 아이콘은 보이지 않는다.
//		linearLayoutCategoryAnalysisGroupName.setVisibility(View.VISIBLE);
//		linearLayoutCategoryAnalysisGroupNameEdit.setVisibility(View.INVISIBLE);
		
		linearLayoutCategoryAnalysisCommon.setVisibility(View.VISIBLE);
		linearLayoutCategoryAnalysisEdit.setVisibility(View.INVISIBLE);
		
		// Category Comment 를 출력하고 입력 란은 보이지 않는다.
		linearLayoutCategoryAnalysisCategoryComment.setVisibility(View.VISIBLE);
		linearLayoutCategoryAnalysisCategoryCommentEdit.setVisibility(View.INVISIBLE);
		
		txtViewAnalysisCategoryNameEdit = (TextView)findViewById(R.id.txtViewAnalysisCategoryNameEdit);
		txtViewAnalysisCategoryNameEdit.setText(categoryName);
		
		/**
		 * Category Icon 을 세팅 한다.
		 * 수정 모드일때 Icon 변경이 가능 하다.
		 */
		imgViewCategoryAnalysisCategoryIcon = (ImageView)findViewById(R.id.imgViewCategoryAnalysisCategoryIcon);
		imgViewCategoryAnalysisCategoryIcon.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				// 수정 모드일때 Group icon 선택이 가능 하다.
				if(("EDIT").equals(MODE)) {
					Intent i = new Intent(DayveCategoryAnalysisView.this, DayveGroupSelectIconView.class);
					i.putExtra("parent_activity_name", "DayveCategoryAnalysisView");
					startActivityForResult(i, 0);
				}
			}
			
		});
		
		
		imgViewCategoryAnalysisCategoryIconSelect = (ImageView)findViewById(R.id.imgViewCategoryAnalysisCategoryIconSelect);
		imgViewCategoryAnalysisCategoryIconSelect.setVisibility(View.INVISIBLE);
		
		imgViewCategoryAnalysisCategoryIconSelect.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				// 수정 모드일때 Group icon 선택이 가능 하다.
				if(("EDIT").equals(MODE)) {
					Intent i = new Intent(DayveCategoryAnalysisView.this, DayveGroupSelectIconView.class);
					i.putExtra("parent_activity_name", "DayveCategoryAnalysisView");
					startActivityForResult(i, 0);
				}
			}
			
		});
		
//		txtViewCategoryAnalysisGroupName = (TextView)findViewById(R.id.txtViewCategoryAnalysisGroupName);
		txtViewAnalysisCategoryName = (TextView)findViewById(R.id.txtViewAnalysisCategoryName);
		txtViewAnalysisCategoryComment = (TextView)findViewById(R.id.txtViewAnalysisCategoryComment);
		
//		edtTextCategoryAnalysisName = (EditText)findViewById(R.id.edtTextCategoryAnalysisName);
//		edtTextCategoryAnalysisComment = (EditText)findViewById(R.id.e)
		
		edtTextCategoryAnalysisCategoryComment = (EditText)findViewById(R.id.edtTextCategoryAnalysisCategoryComment);
		
		// Group Name 을 세팅 한다.
//		txtViewCategoryAnalysisGroupName.setText("  " + groupDatabaseHandler.selectGroup(DAYVE_GROUP_ID).getName().toString() + "  ");
//		
//		SPINNER_GROUP_NAME = groupDatabaseHandler.selectGroup(DAYVE_GROUP_ID).getName().toString();
		
		txtViewAnalysisCategoryName.setText("  " + categoryName + "  ");
		txtViewAnalysisCategoryComment.setText(categoryComment);
		
//		spinnerCategoryAnalysisSelectGroup = (Spinner)findViewById(R.id.spinnerCategoryAnalysisSelectGroup);
//		
//		// Spinner 에 출력할 Group 목록을 가져 온다.
////		ArrayList<DayveGroup> groupList = dbHandler.selectGroupList("" + 0, "" + 10000);
//		ArrayList<DayveGroup> groupList = groupDatabaseHandler.selectGroupList("" + 0, "" + 10000);
//		
//		Log.i(TAG, "groupList.size() : " + groupList.size());
		
		// Category 가 속한 Group Name 을 비교해서 Spinner 초기값을 세팅하기 위해서 position 을 구한다.
//		for(int j=0 ; j<groupList.size() ; j++) {
//			if((SPINNER_GROUP_NAME).equals(groupList.get(j).getName())) {
//				SPINNER_GROUP_NAME_POSITION = j;
//			}
//		}
		
//		GroupSpinnerAdapter groupSpinnerAdapter = new GroupSpinnerAdapter(groupList);
		
//		spinnerCategoryAnalysisSelectGroup.setAdapter(groupSpinnerAdapter);
		
		// 초기값을 세팅 한다.
//		spinnerCategoryAnalysisSelectGroup.setSelection(SPINNER_GROUP_NAME_POSITION);
//		
//		spinnerCategoryAnalysisSelectGroup.setOnItemSelectedListener(new OnItemSelectedListener() {
//
//			public void onItemSelected(AdapterView<?> parent, View view,
//					int position, long id) {
//				// TODO Auto-generated method stub
//				DayveGroup dayveGroup = (DayveGroup)parent.getItemAtPosition(position);
////				Toast.makeText(getApplicationContext(), 
////						"group id   : " + dayveGroup.getIdMyHistoryGroups() + "\n" + 
////						"group name : " + dayveGroup.getName(), Toast.LENGTH_SHORT).show();
//				
//				// Group id, name 을 세팅 한다.
//				DAYVE_GROUP_ID = dayveGroup.getIdMyHistoryGroups();
//				DAYVE_GROUP_NAME = dayveGroup.getName();
//				
//				Log.i(TAG, "DAYVE_GROUP_ID   : " + DAYVE_GROUP_ID);
//				Log.i(TAG, "DAYVE_GROUP_NAME : " + DAYVE_GROUP_NAME);
//			}
//
//			public void onNothingSelected(AdapterView<?> arg0) {
//				// TODO Auto-generated method stub
//				
//			}
//			
//		});
		
		imgViewCategoryAnalysisEdit = (ImageView)findViewById(R.id.imgViewCategoryAnalysisEdit);
		imgViewCategoryAnalysisDelete = (ImageView)findViewById(R.id.imgViewCategoryAnalysisDelete);
		imgViewCategoryAnalysisSave = (ImageView)findViewById(R.id.imgViewCategoryAnalysisSave);
		imgViewCategoryAnalysisBack = (ImageView)findViewById(R.id.imgViewCategoryAnalysisBack);

		// 아이템 생성 버튼을 설정 한다.
		imgViewMenuRegister = (ImageView)findViewById(R.id.imgViewMenuRegister);
		imgViewMenuRegister.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				// 목록에서 터치했을때처럼 onResume 에서 구별하기 위해서 설정 한다.
				ACTIVITY_RESULT = "ON";

				Intent dayveMainView = new Intent(DayveCategoryAnalysisView.this, DayveItemRegisterView.class);
				
				dayveMainView.putExtra("categoryId", categoryId);
				
				startActivityForResult(dayveMainView, 0);
			}

		});

		imgViewFacebook = (ImageView)findViewById(R.id.imgViewFacebook);

		// Facebook 에 Posting 한다.
		imgViewFacebook.setOnClickListener(new View.OnClickListener() {

			public void onClick(View view) {
				// TODO Auto-generated method stub
				new AlertDialog.Builder(DayveCategoryAnalysisView.this)
				.setIcon(R.drawable.dayve_facebook_off)
				.setTitle(getResources().getString(R.string.category_analysis_facebook_title))
				.setMessage(getResources().getString(R.string.category_analysis_facebook_message))
				.setPositiveButton(getResources().getString(R.string.category_analysis_facebook_button_ok), 
						new DialogInterface.OnClickListener() {

					//						@Override
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						mHandler.sendMessage(mHandler.obtainMessage(THREAD_FACEBOOK_POSTING));
					}
				})
				.setNegativeButton(getResources().getString(R.string.category_analysis_facebook_button_cancel), 
						new DialogInterface.OnClickListener() {

					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
					}
				})
				.show();
			}

		});
		
		// 즐겨 찾기 설정.
		imgViewAnalysisCategoryFavoriteY = (ImageView)findViewById(R.id.imgViewAnalysisCategoryFavoriteY);
		imgViewAnalysisCategoryFavoriteN = (ImageView)findViewById(R.id.imgViewAnalysisCategoryFavoriteN);
		
		if(("Y").equals(favoriteYn)) {
			imgViewAnalysisCategoryFavoriteY.setVisibility(View.VISIBLE);
			imgViewAnalysisCategoryFavoriteN.setVisibility(View.INVISIBLE);
		} else {
			imgViewAnalysisCategoryFavoriteY.setVisibility(View.INVISIBLE);
			imgViewAnalysisCategoryFavoriteN.setVisibility(View.VISIBLE);
		}
		
		// 즐겨 찾기 Yes 별 그림을 터치하면 No 로 바뀐다.
		imgViewAnalysisCategoryFavoriteY.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				favoriteYn = "N";
				imgViewAnalysisCategoryFavoriteY.setVisibility(View.INVISIBLE);
				imgViewAnalysisCategoryFavoriteN.setVisibility(View.VISIBLE);
				
				CATEGORY_FAVORITE_YN = "N";
				
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_UPDATE_CATEGORY_FAVORITE));
			}
			
		});
		
		// 즐겨 찾기 No 별 그림을 터치하면 Yes 로 바뀐다.
		imgViewAnalysisCategoryFavoriteN.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				favoriteYn = "Y";
				imgViewAnalysisCategoryFavoriteY.setVisibility(View.VISIBLE);
				imgViewAnalysisCategoryFavoriteN.setVisibility(View.INVISIBLE);
				
				CATEGORY_FAVORITE_YN = "Y";
				
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_UPDATE_CATEGORY_FAVORITE));
			}
			
		});
		
		// 수정 아이콘을 터치했을때를 정의 한다.
		imgViewCategoryAnalysisEdit.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
//				linearLayoutCategoryAnalysisGroupName.setVisibility(View.INVISIBLE);
//				linearLayoutCategoryAnalysisGroupNameEdit.setVisibility(View.VISIBLE);
				
				linearLayoutCategoryAnalysisCommon.setVisibility(View.INVISIBLE);
				linearLayoutCategoryAnalysisEdit.setVisibility(View.VISIBLE);
				
				linearLayoutCategoryAnalysisCategoryComment.setVisibility(View.INVISIBLE);
				linearLayoutCategoryAnalysisCategoryCommentEdit.setVisibility(View.VISIBLE);
				
//				edtTextCategoryAnalysisName.setText(categoryName);
//				edtTextCategoryAnalysisName.setFocusable(true);
				
				edtTextCategoryAnalysisCategoryComment.setText(categoryComment);
				
				MODE = "EDIT";
				
				imgViewCategoryAnalysisCategoryIconSelect.setVisibility(View.VISIBLE);
			}
			
		});
		
		// 뒤로가기(취소) 버튼을 터치했을때를 정의 한다.
		imgViewCategoryAnalysisBack.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
//				linearLayoutCategoryAnalysisGroupName.setVisibility(View.VISIBLE);
//				linearLayoutCategoryAnalysisGroupNameEdit.setVisibility(View.INVISIBLE);
				
				linearLayoutCategoryAnalysisCommon.setVisibility(View.VISIBLE);
				linearLayoutCategoryAnalysisEdit.setVisibility(View.INVISIBLE);
				
				linearLayoutCategoryAnalysisCategoryComment.setVisibility(View.VISIBLE);
				linearLayoutCategoryAnalysisCategoryCommentEdit.setVisibility(View.INVISIBLE);
				
				// 열려진 soft keyboard 를 닫는다.
				InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
				imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
				
				MODE = "";
				
				imgViewCategoryAnalysisCategoryIconSelect.setVisibility(View.INVISIBLE);
			}
			
		});
		
		// 저장 아이콘을 터치했을때를 정의 한다.
		imgViewCategoryAnalysisSave.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_UPDATE));
				
				MODE = "";
			}
			
		});
		
		// 삭제 아이콘을 터치했을때를 정의 한다.
		imgViewCategoryAnalysisDelete.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				
				
				new AlertDialog.Builder(DayveCategoryAnalysisView.this)
				.setTitle(getResources().getString(R.string.category_analysis_deactivate_category_title))
				.setMessage(
						txtViewAnalysisCategoryName.getText().toString().trim() + 
						getResources().getString(R.string.category_analysis_deactivate_category_message_01) + 
						"\n" + 
						getResources().getString(R.string.category_analysis_deactivate_category_message_02)
						)
				.setPositiveButton(getResources().getString(R.string.category_analysis_deactivate_category_button_ok), 
					new DialogInterface.OnClickListener() {
						
//						@Override
						public void onClick(DialogInterface dialog, int which) {
							// TODO Auto-generated method stub
							mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_DEACTIVATE));
						}
					})
				.setNegativeButton(getResources().getString(R.string.category_analysis_deactivate_category_button_cancel), new DialogInterface.OnClickListener() {
					
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
					}
				})
				.show();
			}
			
		});
		
		// 화면에 출력하기 위한 리스트 생성.
		itemViewList = new ArrayList<DayveItem>();
		
		// Local database 에서 item 목록을 가져 온다.
//		itemViewList = itemDatabaseHandler.selectItemListForCategory(categoryId);
//		
//		if(itemViewList.size() < 1) {
//			showNoListToast();
//		}
		
		/**
		 * 열었던 Database 들을 모두 닫는다.
		 */
//		groupDatabaseHandler.close();
		
//		itemDatabaseHandler.close();
		
		/**
		 * Analysis Category Adapter 생성.
		 * 
		 * 위에서 가져온 itemViewList 를 adapter class 바로 세팅하기 때문에
		 * 화면 조작을 위한 다른 로직이 필요 없다.
		 * 
		 * 밑에 thread 로 뿌려주는 로직들은 모두 삭제 예정.
		 */
		dayveCategoryAnalysisAdapter = new DayveCategoryAnalysisAdapter(getApplicationContext(), itemViewList);
		
		// list view 의 cursor 를 제공 하기 위해서 어댑터를 세팅 한다.
		setListAdapter(dayveCategoryAnalysisAdapter);

		// 스크롤 이벤트 리스너를 등록 한다.
//		getListView().setOnScrollListener(this);

		//List 레이아웃 그리기 캐쉬를 설정 한다.
		getListView().setAlwaysDrawnWithCacheEnabled (true);

	}

	/**
	 * Handler 를 정의한다.
	 * 모든 Thread 를 등록해 놓고 필요할때 호출한다.
	 */
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what) {
			// 로그를 저장한다.
			case THREAD_INSERT_LOG : 
				break;
			// 프로그레스 바를 출력 한다.
			case THREAD_PROGRESS_BAR_VISIBLE : 
				analysisCategoryProgressBar.setVisibility(View.VISIBLE);
				break;
			// 프로그레스 바를 감춘다.
			case THREAD_PROGRESS_BAR_INVISIBLE : 
				analysisCategoryProgressBar.setVisibility(View.INVISIBLE);
				break;
			// item 목록을 가져 와서 출력 한다.
			case THREAD_CATEGORY_ITEM_LIST : 
				// 화면을 출력하기 직전에 목록을 삭제 한다. 
				itemViewList.clear();
				
				// 
//				dayveCategoryAnalysisAdapter = new DayveCategoryAnalysisAdapter(getApplicationContext(), itemViewList);
//				
//				// list view 의 cursor 를 제공 하기 위해서 어댑터를 세팅 한다.
//				setListAdapter(dayveCategoryAnalysisAdapter);
				
				runOnUiThread(selectItemList);
				
				showCategoryAnalysisGraph();
				
				break;
			// item 목록을 업데이트 한다.
			case THREAD_CATEGORY_ITEM_REFRESH : 
//				itemViewList.clear();
//				dbHandler.deleteDayveItem();
//				threadSelectItemListForCategoryAnalysis();
				
				dayveCategoryAnalysisAdapter.notifyDataSetChanged();
				
				threadSelectItemListForCategoryAnalysis();
				
				break;
			// 목록 가져오기에 성공하면 Toast 를 띄운다.
			case THREAD_CATEGORY_ITEM_LIST_SUCCESS : 
				break;
			// 목록 가져오기에 실패하면 Dialog 를 띄운다.
			case THREAD_CATEGORY_ITEM_LIST_FAIL : 
				break;
			// Category 를 수정 한다.
			case THREAD_CATEGORY_UPDATE : 
				threadUpateCategory();
				break;
			// Category 수정에 성공하면 toast 를 띄운다.
			case THREAD_CATEGORY_UPDATE_SUCCESS : 
				showUpdateCategoryToast();
				break;
			// Category 수정에 실패하면 dialog 를 띄운다.
			case THREAD_CATEGORY_UPDATE_FAIL : 
				showUpdateCategoryFail();
				break;
			// Category 를 비활성화 한다.
			case THREAD_CATEGORY_DEACTIVATE : 
				threadUpdateDeactivateCategory();
				break;
			// Category 비활성화에 성공하면 toast 를 띄운다.
			case THREAD_CATEGORY_DEACTIVATE_SUCCESS : 
				showUpdateDeactivateCategoryToast();
				break;
			// Category 비활성화에 실패하면 dialog 창을 띄운다.
			case THREAD_CATEGORY_DEACTIVATE_FAIL : 
				showUpdateDeactivateCategoryFail();
				break;
			// Category Analysis Graph 를 출력 한다.
			case THREAD_CATEGORY_ALAYSIS_GRAPH : 
				showCategoryAnalysisGraph();
				break;
			// Category Analysis Graph layout 을 출력 한다.
			case THREAD_CATEGORY_ALAYSIS_GRAPH_VISIBLE : 
				linearLayoutAnalysisCategory.setVisibility(View.VISIBLE);
				break;
			// Category Analysis Graph layout 을 감춘다.
			case THREAD_CATEGORY_ALAYSIS_GRAPH_INVISIBLE : 
				linearLayoutAnalysisCategory.setVisibility(View.INVISIBLE);
				break;
			// Facebook Posting.
			case THREAD_FACEBOOK_POSTING : 
				sendFacebookPosting();
				break;
			// Category 즐겨 찾기 상태를 변경 한다.
			case THREAD_UPDATE_CATEGORY_FAVORITE : 
				/**
				 * thread 가 돌면서 graph 가 겹쳐지는 문제를 해결하기 위해서
				 * thread 가 돌기 전에 graph 를 감추고, 
				 * thread 가 완료되면 다시 보여 준다.
				 */
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_ITEM_LIST));
				threadUpdateFavoriteCategory();
				linearLayoutAnalysisCategory.setVisibility(View.VISIBLE);
				showCategoryAnalysisGraph();
				break;
			// Category 즐겨 찾기 상태 변경에 성공하면 toaset 를 띄운다.
			case THREAD_UPDATE_CATEGORY_FAVORITE_SUCCESS : 
				showUpdateFavoriteCategoryToast();
				break;
			// Category 즐겨 찾기 상태 변경에 실패하면 dialog 를 띄운다.
			case THREAD_UPDATE_CATEGORY_FAVORITE_FAIL : 
				showUpdateFavoriteCategoryFail();
				break;
			}
		}
	};
	
	/**
	 * Facebook 에 Posting 한다.
	 */
	private void sendFacebookPosting() {
		Log.i(TAG, "sendFacebookPosting");
		
		// ProgressBar 출력.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		// Layout 을 capture 한다.
		linearLayoutAnalysisCategory.setDrawingCacheEnabled(true);
		Bitmap bm = linearLayoutAnalysisCategory.getDrawingCache();
		
		Log.e(TAG, "byte : " + bm.getRowBytes());
		
		// 화면을 저장하고 경로를 가져 온다.
		FACEBOOK_LINK = dayveCommon.screenshot(bm);
		
		Log.e(TAG, "FACEBOOK_LINK : " + FACEBOOK_LINK);
		
		/**
		 * Facebook 에 사진을 올리기 위해서 bitmap 을 byte 로 변환 한다.
		 */
		ByteArrayOutputStream stream = new ByteArrayOutputStream();
		bm.compress(Bitmap.CompressFormat.JPEG, 100, stream);
		byte[] byteArray = stream.toByteArray();

		Intent i = new Intent(DayveCategoryAnalysisView.this, DayveFacebookView.class);
		
		i.putExtra("content", FACEBOOK_CONTENT);
		i.putExtra("link", FACEBOOK_LINK);
		i.putExtra("photoBytes", byteArray);
		
//		Log.i(TAG, "> FACEBOOK_CONTENT : " + FACEBOOK_CONTENT);
//		Log.i(TAG, "> FACEBOOK_LINK    : " + FACEBOOK_LINK);
		
		startActivityForResult(i, 0);
		
		// Facebook 전송 후 파라메터를 초기화 한다.
		FACEBOOK_CONTENT = "";
		FACEBOOK_LINK = "";
	}
	
	/**
	 * Category Analysis Graph 를 출력 한다. 
	 * 
	 * 1. Version1.0 : 
	 * - 최대 6개까지의 목록을 받아 온다.
	 * - 1~5위 목록, 기타목록.
	 */
	private void showCategoryAnalysisGraph() {
		
		Log.e(TAG, "itemViewList.size() : " + itemViewList.size());
		
		String data1 = "";
		String data2 = "";
		String data3 = "";
		String data4 = "";
//		String data5 = "";
//		String data6 = "";
		
//		double percent1 = 0;
//		double percent2 = 0;
//		double percent3 = 0;
//		double percent4 = 0;
//		double percent5 = 0;
//		double percent6 = 0;
		
		List<double[]> values = new ArrayList<double[]>();
		
//		itemDatabaseHandler = DayveItemDatabaseHandler.open(getApplicationContext());
//		ArrayList<DayveItem> resultList = dayveCommon.getCategoryAnalysisGraphData(itemDatabaseHandler.selectItemListForCategory(categoryId));
//		itemDatabaseHandler.close();
		
		ArrayList<DayveItem> resultList = dayveCommon.getCategoryAnalysisGraphData(itemViewList);
		
//		FACEBOOK_CONTENT = "" + 
//			"<" + txtViewAnalysisCategoryName.getText() + "> 카테고리의 아이템 순위." + "\n\n" + 
//			"1. " + resultList.get(0).getName() + " : " + resultList.get(0).getAmount() +"회 (" + resultList.get(0).getPercent() + "%)" + "\n" + 
//			"2. " + resultList.get(1).getName() + " : " + resultList.get(1).getAmount() +"회 (" + resultList.get(1).getPercent() + "%)" + "\n" + 
//			"3. " + resultList.get(2).getName() + " : " + resultList.get(2).getAmount() +"회 (" + resultList.get(2).getPercent() + "%)" + "\n" + 
//			"4. " + resultList.get(3).getName() + " : " + resultList.get(3).getAmount() +"회 (" + resultList.get(3).getPercent() + "%)" + "\n" + 
//			"5. " + resultList.get(4).getName() + " : " + resultList.get(4).getAmount() +"회 (" + resultList.get(4).getPercent() + "%)" + "\n" + 
//			"" + resultList.get(5).getName() + " : " + resultList.get(5).getAmount() +"회 (" + resultList.get(5).getPercent() + "%)" + "\n"
//			;
		
		/**
		 * Amount 가 있는 항목만 Facebook 으로 보낸다.
		 */
		if(Integer.parseInt(resultList.get(0).getAmount().toString()) > 0) {
			FACEBOOK_CONTENT = "<" + txtViewAnalysisCategoryName.getText() + getResources().getString(R.string.category_analysis_graph_category_items) + "\n\n" + 
				"1. " + resultList.get(0).getName() + " : " + resultList.get(0).getAmount() + getResources().getString(R.string.category_analysis_graph_category_items_amounts) + resultList.get(0).getPercent() + "%)" + "\n";
		}
		if(Integer.parseInt(resultList.get(1).getAmount().toString()) > 0) {
			FACEBOOK_CONTENT = FACEBOOK_CONTENT + "2. " + resultList.get(1).getName() + " : " + resultList.get(1).getAmount() + getResources().getString(R.string.category_analysis_graph_category_items_amounts) + resultList.get(1).getPercent() + "%)" + "\n";
		}
		if(Integer.parseInt(resultList.get(2).getAmount().toString()) > 0) {
			FACEBOOK_CONTENT = FACEBOOK_CONTENT + "3. " + resultList.get(2).getName() + " : " + resultList.get(2).getAmount() + getResources().getString(R.string.category_analysis_graph_category_items_amounts) + resultList.get(2).getPercent() + "%)" + "\n";
		}
		if(Integer.parseInt(resultList.get(3).getAmount().toString()) > 0) {
			FACEBOOK_CONTENT = FACEBOOK_CONTENT + "" + resultList.get(3).getName() + " : " + resultList.get(3).getAmount() + getResources().getString(R.string.category_analysis_graph_category_items_amounts) + resultList.get(3).getPercent() + "%)" + "\n";
		}
//		if(Integer.parseInt(resultList.get(4).getAmount().toString()) > 0) {
//			FACEBOOK_CONTENT = FACEBOOK_CONTENT + "5. " + resultList.get(4).getName() + " : " + resultList.get(4).getAmount() +"회 (" + resultList.get(4).getPercent() + "%)" + "\n";
//		}
//		if(Integer.parseInt(resultList.get(5).getAmount().toString()) > 0) {
//			FACEBOOK_CONTENT = FACEBOOK_CONTENT + "" + resultList.get(5).getName() + " : " + resultList.get(5).getAmount() +"회 (" + resultList.get(5).getPercent() + "%)" + "\n";
//		}
		
		
		for(int i=0 ; i<resultList.size() ; i++) {
			values.add(new double[] { Double.parseDouble(resultList.get(0).getPercent()), 0, 0, 0 });
			values.add(new double[] { 0, Double.parseDouble(resultList.get(1).getPercent()), 0, 0 });
			values.add(new double[] { 0, 0, Double.parseDouble(resultList.get(2).getPercent()), 0 });
			values.add(new double[] { 0, 0, 0, Double.parseDouble(resultList.get(3).getPercent()) });
//			values.add(new double[] { 0, 0, 0, 0, Double.parseDouble(resultList.get(4).getPercent()), 0 });
//			values.add(new double[] { 0, 0, 0, 0, 0, Double.parseDouble(resultList.get(5).getPercent()) });
			
			Log.e(TAG, "기타 값 : " + Double.parseDouble(resultList.get(3).getPercent()));
			
			data1 = resultList.get(0).getName();
			data2 = resultList.get(1).getName();
			data3 = resultList.get(2).getName();
			data4 = resultList.get(3).getName();
//			data5 = resultList.get(4).getName();
//			data6 = resultList.get(5).getName();
			
			// 기타 항목은 수치가 있으면 출력하고 없으면 공백을 출력 한다.
			if(Double.parseDouble(resultList.get(3).getPercent()) > 0) {
				data4 = getResources().getString(R.string.category_analysis_graph_category_items_etc);
			} else {
				data4 = "";
			}
		}
		
//		values.add(new double[] { 25, 0, 0, 0, 0, 0 });
//		values.add(new double[] { 0, 5, 0, 0, 0, 0 });
//		values.add(new double[] { 0, 0, 15, 0, 0, 0 });
//		values.add(new double[] { 0, 0, 0, 3, 0, 0 });
//		values.add(new double[] { 0, 0, 0, 0, 5, 0 });
//		values.add(new double[] { 0, 0, 0, 0, 0, 47 });

		/** 그래프 출력을 위한 그래픽 속성 지정객체 */  
		XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();  

		// 상단 표시 제목과 글자 크기  
//		renderer.setChartTitle("점심식사");  
//		renderer.setChartTitleTextSize(20);  

		// 분류에 대한 이름  
//		String[] titles = new String[] { "대구탕", "반계탕", "백반", "비빔밥", "칼국수", "기타" };
		String[] titles = new String[] { data1 + "  ", data2 + "  ", data3 + "  ", data4 };

		// 항목을 표시하는데 사용되는 컬러코
		int[] colors = new int[] { 
				Color.rgb(53, 184, 226), 
				Color.rgb(233, 82, 115), 
				Color.rgb(128, 192, 63), 
				Color.rgb(239, 126, 29)
//				Color.rgb(232, 217, 42), 
//				Color.rgb(247, 217, 248) 
				};  

		// 분류명 글자 크기 및 각 색상 지정  
		renderer.setLegendTextSize(16);  
		int length = colors.length;  
		for (int j = 0; j < length; j++) {  
			SimpleSeriesRenderer r = new SimpleSeriesRenderer();  
			r.setColor(colors[j]);  
			renderer.addSeriesRenderer(r);  
		}  

		// X,Y축 항목이름과 글자 크기  
		//        renderer.setXTitle("월");
		renderer.setXTitle("");
//		renderer.setYTitle("판매량");  
		//        renderer.setAxisTitleTextSize(12);
		renderer.setAxisTitleTextSize(18);

		// 수치값 글자 크기 / X축 최소,최대값 / Y축 최소,최대값  
		renderer.setLabelsTextSize(14);  
		renderer.setXAxisMin(0.5);  
		renderer.setXAxisMax(4.5);  
		renderer.setYAxisMin(0);  
		renderer.setYAxisMax(100);  

		// X,Y축 라인 색상  
		renderer.setAxesColor(Color.WHITE);  
		// 상단제목, X,Y축 제목, 수치값의 글자 색상  
		renderer.setLabelsColor(Color.WHITE);

		// X축의 표시 간격  
		renderer.setXLabels(0);
		// Y축의 표시 간격  
		renderer.setYLabels(2);

		// X,Y축 정렬방향  
		renderer.setXLabelsAlign(Align.LEFT);  
		renderer.setYLabelsAlign(Align.LEFT);  
		// X,Y축 스크롤 여부 ON/OFF  
		renderer.setPanEnabled(false, false);  
		// ZOOM기능 ON/OFF  
		renderer.setZoomEnabled(false, false);  
		// ZOOM 비율  
		renderer.setZoomRate(1.0f);  
		// 막대간 간격  
		renderer.setBarSpacing(0.5f);
		
		// Graph 의 배경과 테두리 컬러를 설정 한다.
		renderer.setApplyBackgroundColor(true);
		renderer.setBackgroundColor(Color.DKGRAY);
		renderer.setMarginsColor(Color.DKGRAY);

		// 설정 정보 설정  
		XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset(); 
		
		for (int k = 0; k < titles.length; k++) {  
			CategorySeries series = new CategorySeries(titles[k]);
			double[] v = values.get(k);  
			int seriesLength = v.length;  
			
			for (int l = 0; l < seriesLength; l++) {  
				series.add(v[l]);  
			}
			
			dataset.addSeries(series.toXYSeries());  
		}  

		// 그래프 객체 생성  
		GraphicalView gv = ChartFactory.getBarChartView(this, dataset,  
				renderer, Type.STACKED);
		
		/**
		 * 그래프를 LinearLayout에 추가한다.
		 * 기존의 것을 지우고 다시 그린다.
		 */
		LinearLayout llBody = (LinearLayout) findViewById(R.id.linearLayoutAnalysisCategory);
		llBody.removeAllViews();
		llBody.addView(gv);
	}
	
	/**
	 * 목록을 터치하면 item 과 포함되는 category 의 정보를 가져 온다.
	 */
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		// TODO Auto-generated method stub
		super.onListItemClick(l, v, position, id);
		
//		if(dbHandler == null) {
//			dbHandler = DatabaseHandler.open(getApplicationContext());
//		}
		
		categoryDatabaseHandler = DayveCategoryDatabaseHandler.open(getApplicationContext());
		
		DayveCategory dayveCategory = categoryDatabaseHandler.selectCategory(itemViewList.get(position).getMyHistoryCategoriesIdMyHistoryCategories());
		
		Log.i(TAG, "category name : " + dayveCategory.getName());
		
		if(categoryDatabaseHandler != null) {
			categoryDatabaseHandler.close();
		}
		
		/**
		 * refresh 가 실행중이 아닐때만 amount 보기가 가능하다.
		 */
		if(("").equals(RESULT_ITEM_REGISTER)) {
			Intent i = new Intent(this, DayveItemAmountView.class);
			
			i.putExtra("position", position);
			
			i.putExtra("idMyHistoryItems", itemViewList.get(position).getIdMyHistoryItems());
			i.putExtra("name", itemViewList.get(position).getName());
			i.putExtra("comment", itemViewList.get(position).getComment());
			i.putExtra("amount", itemViewList.get(position).getAmount());
			i.putExtra("openItemYn", itemViewList.get(position).getOpenItemYn());
			i.putExtra("favoriteYn", itemViewList.get(position).getFavoriteYn());
			i.putExtra("activateYn", itemViewList.get(position).getActivateYn());
			i.putExtra("myHistoryCategoriesIdMyHistoryCategories", itemViewList.get(position).getMyHistoryCategoriesIdMyHistoryCategories());
			
			i.putExtra("categoryName", dayveCategory.getName());
			
			// 호출한 부모 activity 명을 넘겨 준다.
			i.putExtra("parent_activity_name", "DayveCategoryAnalysisView");
			
			Log.e(TAG, "favoriteYn : " + itemViewList.get(position).getFavoriteYn());
			
			startActivityForResult(i, 0);
			
			ACTIVITY_RESULT = "ON";
		}
	}
	
	/**
	 * Category 를 수정 한다.
	 * 
	 * 실제 로직은 updateCategory 메소드에서 처리한다.
	 * 쓰레드로 돌리기 위한 임시 메소드 이다.
	 */
	private void threadUpateCategory() {
		Log.i(TAG, "threadUpateCategory");
		
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				updateCategory();
			}
			
		});
		
		thread.start();
	}
	
	/**
	 * Category 내용을 수정 한다.
	 */
	private void updateCategory() {
		Log.i(TAG, "updateCategory");
		
		DayveCategory parameterCategory = new DayveCategory();
		
		parameterCategory.setIdMyHistoryCategories(categoryId);
		parameterCategory.setName(categoryName);
		parameterCategory.setComment(edtTextCategoryAnalysisCategoryComment.getText().toString().trim());
		parameterCategory.setIconUrl(categoryIconUrl);
		parameterCategory.setOpenCategoryYn(openCategoryYn);
		parameterCategory.setFavoriteYn(favoriteYn);
		parameterCategory.setModifyDate(currentDate);
		parameterCategory.setActivateYn("Y");
		parameterCategory.setMyHistoryMembersId(DAYVE_ID);
		
		Log.e(TAG, "categoryIconUrl : " + categoryIconUrl);
		
		try {
			RESULT_UPDATE_CATEGORY = dayveCategoryRest.updateCategory(parameterCategory).getResult();
			
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		}

		// Database 를 닫는다.
//		if(groupDatabaseHandler != null) {
//			groupDatabaseHandler.close();
//		}
//		
//		if(categoryDatabaseHandler != null) {
//			categoryDatabaseHandler.close();
//		}
//		
//		if(itemDatabaseHandler != null) {
//			itemDatabaseHandler.close();
//		}
		
		/**
		 * 결과에 따라서 다이얼로그 창을 띄운다.
		 * 
		 * 성공하면 등록화면을 닫고 카테고리 목록 화면으로 이동 한다.
		 * 실패하면 다이얼로그 창을 띄워서 다시 등록할 것인지 확인 한다.
		 */
		if(("SUCCESS").equals(RESULT_UPDATE_CATEGORY)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_UPDATE_SUCCESS));

			// 화면을 닫는다.
//			DayveCategoryView.RESULT_CATEGORY_REGISTER = "SUCCESS";
			
			Log.e(TAG, ">> PARENT_ACTIVITY_NAME : " + PARENT_ACTIVITY_NAME);
			
//			if(("DayveCategoryView").equals(PARENT_ACTIVITY_NAME)) {
//				DayveCategoryView.RESULT_CATEGORY_REGISTER = "SUCCESS";
//			} else if(("DayveFavoriteView").equals(PARENT_ACTIVITY_NAME)) {
//				DayveFavoriteView.RESULT_CATEGORY_REGISTER = "SUCCESS";
//			}
			
			/**
			 * Category 와 Favorite 는 다른 database 를 사용하기 때문에
			 * 수정을 하면 두 database 모두 refresh 해주어야 한다.
			 */
			DayveCategoryView.RESULT_CATEGORY_REGISTER = "SUCCESS";
//			DayveCategoryView.ACTIVITY_RESULT = "";
			DayveFavoriteView.RESULT_CATEGORY_REGISTER = "SUCCESS";
//			DayveFavoriteView.ACTIVITY_RESULT = "";
			DayveItemView.RESULT_ITEM_REGISTER = "SUCCESS";

			Intent i = new Intent();
			setResult(RESULT_OK, i);
			
			/**
			 * 화면을 닫는다.
			 * Category 목록 탭화면에서는 refresh 를 한다.
			 */
			finish();
		} else {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_UPDATE_FAIL));
		}
	}
	
	/**
	 * category 수정 성공 Toast 를 띄운다.
	 */
	private void showUpdateCategoryToast() {
		CharSequence text = getResources().getString(R.string.category_analysis_success_update_category);
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
	/**
	 * category 수정 실패 dialog 창을 띄운다.
	 */
	private void showUpdateCategoryFail() {
		Log.e(TAG, "showDialogRegisterCategoryFail");
		
		new AlertDialog.Builder(DayveCategoryAnalysisView.this)
		.setTitle(getResources().getString(R.string.category_analysis_fail_update_category_title))
		.setMessage(
				getResources().getString(R.string.category_analysis_fail_update_category_message_01) + 
				"\n" + 
				getResources().getString(R.string.category_analysis_fail_update_category_message_02)
				)
		.setPositiveButton(getResources().getString(R.string.category_analysis_fail_update_category_button), 
			new DialogInterface.OnClickListener() {
				
//				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
				}
			}).show();
	}
	
	/**
	 * Category 즐겨 찾기 상태를 변경 한다.
	 */
	private void threadUpdateFavoriteCategory() {
		Log.i(TAG, "threadUpdateFavoriteCategory");
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));

		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				updateFavoriteCategory();
			}

		});

		thread.start();
	}
	
	/**
	 * Category 즐겨 찾기 상태를 변경 한다.
	 */
	private void updateFavoriteCategory() {
		Log.i(TAG, "updateFavoriteCategory");
		
		DayveCategory parameterCategory = new DayveCategory();
		
		parameterCategory.setIdMyHistoryCategories(categoryId);
		parameterCategory.setFavoriteYn(CATEGORY_FAVORITE_YN);
		parameterCategory.setActivateYn("Y");
		parameterCategory.setModifyDate(currentDate);
		parameterCategory.setMyHistoryMembersId(DAYVE_ID);
		
		try {
			RESULT_DEACTIVE_CATEGORY = dayveCategoryRest.updateFavoriteCategory(parameterCategory).getResult();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		}
		
		if(("SUCCESS").equals(RESULT_DEACTIVE_CATEGORY)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_UPDATE_CATEGORY_FAVORITE_SUCCESS));
			
			DayveCategoryView.RESULT_CATEGORY_REGISTER = "SUCCESS";
			DayveFavoriteView.RESULT_CATEGORY_REGISTER = "SUCCESS";
			DayveItemView.RESULT_ITEM_REGISTER = "SUCCESS";
			DayveGroupInformationView.RESULT_CATEGORY_REGISTER = "SUCCESS";
			
			Intent i = new Intent();
			setResult(RESULT_OK, i);
		} else {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_UPDATE_CATEGORY_FAVORITE_FAIL));
		}
	}
	
	/**
	 * category 즐겨찾기 성공 Toast 를 띄운다.
	 */
	private void showUpdateFavoriteCategoryToast() {
		Log.i(TAG, "showUpdateDeactivateCategoryToast");
		
		CharSequence text = "";
		
		if(("Y").equals(CATEGORY_FAVORITE_YN)) {
			text = getResources().getString(R.string.category_analysis_success_add_favorite_category);
		} else {
			text = getResources().getString(R.string.category_analysis_success_deactivate_favorite_category);
		}
		
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
	/**
	 * category 즐겨찾기 실패 dialog 창을 띄운다.
	 */
	private void showUpdateFavoriteCategoryFail() {
		Log.e(TAG, "showUpdateDeactivateCategoryFail");
		
		new AlertDialog.Builder(DayveCategoryAnalysisView.this)
		.setTitle(getResources().getString(R.string.category_analysis_update_favorite_title))
		.setMessage(
				getResources().getString(R.string.category_analysis_update_favorite_message_01) + 
				"\n" + 
				getResources().getString(R.string.category_analysis_update_favorite_message_02)
				)
		.setPositiveButton(getResources().getString(R.string.category_analysis_update_favorite_button), 
			new DialogInterface.OnClickListener() {
				
//				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
				}
			}).show();
	}
	
	/**
	 * Category 를 비활성화 한다.
	 * 
	 * 실제 로직은 deactivateCategory 메소드에서 처리한다.
	 * 쓰레드로 돌리기 위한 임시 메소드 이다.
	 */
	private void threadUpdateDeactivateCategory() {
		Log.i(TAG, "threadDeactivateCategory");
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));

		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				updateDeactivateCategory();
			}

		});

		thread.start();
	}
	
	/**
	 * Category 를 비활성화 한다.
	 */
	private void updateDeactivateCategory() {
		Log.i(TAG, "deactivateCategory");
		
		DayveCategory parameterCategory = new DayveCategory();
		
		parameterCategory.setIdMyHistoryCategories(categoryId);
		parameterCategory.setActivateYn("N");
		parameterCategory.setModifyDate(currentDate);
		parameterCategory.setMyHistoryMembersId(DAYVE_ID);
		
		try {
			RESULT_DEACTIVE_CATEGORY = dayveCategoryRest.updateDeactivateCategory(parameterCategory).getResult();
			
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		}

		// Database 를 닫는다.
//		if(groupDatabaseHandler != null) {
//			groupDatabaseHandler.close();
//		}
//
//		if(categoryDatabaseHandler != null) {
//			categoryDatabaseHandler.close();
//		}
//
//		if(itemDatabaseHandler != null) {
//			itemDatabaseHandler.close();
//		}

		/**
		 * 결과에 따라서 다이얼로그 창을 띄운다.
		 * 
		 * 성공하면 등록화면을 닫고 카테고리 목록 화면으로 이동 한다.
		 * 실패하면 다이얼로그 창을 띄워서 다시 등록할 것인지 확인 한다.
		 */
		if(("SUCCESS").equals(RESULT_DEACTIVE_CATEGORY)) {
			Log.i(TAG, "RESULT_DEACTIVE_CATEGORY : " + RESULT_DEACTIVE_CATEGORY);
			
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_DEACTIVATE_SUCCESS));
			
			// Category, Item 화면이 열리면 모두 refresh 한다.
//			DayveCategoryView.RESULT_CATEGORY_REGISTER = "SUCCESS";
//			DayveCategoryView.RESULT_CATEGORY_DELETE = "SUCCESS";
			
			Log.e(TAG, ">> PARENT_ACTIVITY_NAME : " + PARENT_ACTIVITY_NAME);
			
//			if(("DayveCategoryView").equals(PARENT_ACTIVITY_NAME)) {
//				DayveCategoryView.RESULT_CATEGORY_REGISTER = "SUCCESS";
//			} else if(("DayveFavoriteView").equals(PARENT_ACTIVITY_NAME)) {
//				DayveFavoriteView.RESULT_CATEGORY_REGISTER = "SUCCESS";
//			}
			
			/**
			 * Category 와 Favorite 는 다른 database 를 사용하기 때문에
			 * 수정을 하면 두 database 모두 refresh 해주어야 한다.
			 * 
			 * 목록에서 터치해서 수정한 경우
			 * onActivityResult 에서 받아서 refresh 하기 때문에
			 * onResume 에서 구별하기 위해서 ACTIVITY_RESULT 값을 세팅해준다.
			 * 
			 * 
			 */
			DayveCategoryView.RESULT_CATEGORY_REGISTER = "SUCCESS";
//			DayveCategoryView.ACTIVITY_RESULT = "";
			DayveFavoriteView.RESULT_CATEGORY_REGISTER = "SUCCESS";
//			DayveFavoriteView.ACTIVITY_RESULT = "";
			DayveItemView.RESULT_ITEM_REGISTER = "SUCCESS";
			DayveGroupInformationView.RESULT_CATEGORY_REGISTER = "SUCCESS";
			
			Intent i = new Intent();
			setResult(RESULT_OK, i);

			/**
			 * 화면을 닫는다.
			 * Category 목록 탭화면에서는 refresh 를 한다.
			 */
			finish();
		} else {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_DEACTIVATE_FAIL));
		}
	}
	
	/**
	 * category 비활성화 성공 Toast 를 띄운다.
	 */
	private void showUpdateDeactivateCategoryToast() {
		Log.i(TAG, "showUpdateDeactivateCategoryToast");
		
		CharSequence text = getResources().getString(R.string.category_analysis_success_deactivate_category);
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
	/**
	 * category 비활성화 실패 dialog 창을 띄운다.
	 */
	private void showUpdateDeactivateCategoryFail() {
		Log.e(TAG, "showUpdateDeactivateCategoryFail");
		
		new AlertDialog.Builder(DayveCategoryAnalysisView.this)
		.setTitle(getResources().getString(R.string.category_analysis_fail_deactivate_category_title))
		.setMessage(
				getResources().getString(R.string.category_analysis_fail_deactivate_category_message_01) + 
				"\n" + 
				getResources().getString(R.string.category_analysis_fail_deactivate_category_message_02)
				)
		.setPositiveButton(getResources().getString(R.string.category_analysis_fail_deactivate_category_button), 
			new DialogInterface.OnClickListener() {
				
//				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
				}
			}).show();
	}
	
	/**
	 * Category 의 item 목록을 가져 온다.
	 */
	private void threadSelectItemListForCategoryAnalysis() {
		Log.i(TAG, "threadSelectItemListForCategoryAnalysis");
		
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		// item 목록을 생성 한다.
		itemList = new ArrayList<DayveItem>();
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				selectItemListForCategoryAnalysis();
			}
			
		});
		
		thread.start();
	}
	
	/**
	 * Server 에서 Category 에 등록된 item 목록을 가져 와서 저장 한다.
	 */
	private void selectItemListForCategoryAnalysis() {
		Log.i(TAG, "selectItemListForCategoryAnalysis");
		
		DayveItem parameterItem = new DayveItem();
		
//		parameterItem.setActivateYn("Y");
//		parameterItem.setMyHistoryMembersId(DAYVE_ID);
//		parameterItem.setMyHistoryCategoriesIdMyHistoryCategories(categoryId);
		
		parameterItem.setActivateYn("Y");
		parameterItem.setMyHistoryMembersId(DAYVE_ID);
		parameterItem.setItemStart(0);
		parameterItem.setItemCount(1000000);			// 한번에 모두 가져 오기 위해서 10000000.
		
		/**
		 * database 를 open 한다.
		 */
		itemDatabaseHandler = DayveItemDatabaseHandler.open(getApplicationContext());
		itemDatabaseHandler.deleteDayveItem();
//		itemDatabaseHandler.close();
		
//		itemDatabaseHandler = DayveItemDatabaseHandler.open(getApplicationContext());
		itemDatabaseHandler.beginTransaction();
//		dbHandler.beginTransaction();
		
		try {
			itemList = dayveCategoryRest.selectItemListForCategoryAnalysis(parameterItem);
			
			for(int i=0 ; i<itemList.size() ; i++) {
				ContentValues values = new ContentValues();
				
				values.put("id_myhistory_items", itemList.get(i).getIdMyHistoryItems());
				values.put("name", itemList.get(i).getName());
				values.put("comment", itemList.get(i).getComment());
				values.put("amount", itemList.get(i).getAmount());
				values.put("open_item_yn", itemList.get(i).getOpenItemYn());
				values.put("favorite_yn", itemList.get(i).getFavoriteYn());
				values.put("activate_yn", itemList.get(i).getActivateYn());
				values.put("modify_date", itemList.get(i).getModifyDate());
				values.put("register_date", itemList.get(i).getRegisterDate());
				values.put("myhistory_members_id", itemList.get(i).getMyHistoryMembersId());
				values.put("myhistory_categories_id_myhistory_categories", itemList.get(i).getMyHistoryCategoriesIdMyHistoryCategories());
				
				itemDatabaseHandler.insertDayveItem(values);
			}
			
			itemDatabaseHandler.setTransactionSuccessful();

		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			itemDatabaseHandler.endTransaction();
			
			if(itemDatabaseHandler != null) {
				itemDatabaseHandler.close();
			}
		}
		
		/**
		 * Database 를 close 한다.
		 */
		if(itemDatabaseHandler != null) {
			itemDatabaseHandler.close();
		}
		
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_ITEM_LIST));
		
		RESULT_ITEM_REGISTER = "";
		ACTIVITY_RESULT = "";
	}

	/**
	 * 출력할 목록이 없다는 Toast 를 띄운다.
	 */
	private void showNoListToast() {
		CharSequence text = getResources().getString(R.string.category_analysis_not_found_list_01) + "\n" + getResources().getString(R.string.category_analysis_not_found_list_02);
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
	/* Item 목록에서 Item Amount 화면으로 이동해서 수정할 경우
	 * Item 목록을 refresh 한다.
	 * 
	 * @see android.app.Activity#onActivityResult(int, int, android.content.Intent)
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		
		if(requestCode == 0) {
			if(resultCode == RESULT_OK) {
				Log.e(TAG, "refresh.");
				
				/**
				 * Item Amount 를 update 한 경우만 refresh 를 하고, 
				 * Facebook Posting 을 한 경우는 refresh 를 하지 않는다.
				 */
				if(("").equals(RESULT_FACEBOOK_POSTING)) {
					Log.e(TAG, ">>>>>>>>>>> RESULT_FACEBOOK_POSTING : " + "");
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_ALAYSIS_GRAPH_INVISIBLE));
					
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_ITEM_REFRESH));
				} else {
//					mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
				}
				
				// 초기화 한다.
				RESULT_FACEBOOK_POSTING = "";
			}
		}
	}

	/* 화면이 출력되면 로그를 저장 한다.
	 * 
	 * @see android.app.Activity#onResume()
	 */
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();

		Log.i(TAG, "onResume");
		
		// Category Icon 을 세팅 한다.
		int lid = this.getResources().getIdentifier(categoryIconUrl, "drawable", this.getPackageName());
		imgViewCategoryAnalysisCategoryIcon.setImageResource(lid);
		
		Log.e(TAG, "RESULT_ITEM_REGISTER : " + RESULT_ITEM_REGISTER);
		
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_ALAYSIS_GRAPH_INVISIBLE));

		if(("").equals(RESULT_ITEM_REGISTER)) {
			Log.e(TAG, "process..............");
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_ITEM_LIST));
		} else if(("SUCCESS").equals(RESULT_ITEM_REGISTER) && ("").equals(ACTIVITY_RESULT)) {
			Log.e(TAG, ">>>>>>>>>>> RESULT_ITEM_REGISTER 5678 : " + RESULT_ITEM_REGISTER);
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_ITEM_REFRESH));
		}
		
		/**
		 * 화면 출력이 완료되면 onActivityResult 실행 파라메터를 초기화 한다.
		 */
		ACTIVITY_RESULT = "";

		// main thread 에서 child thread 를 호출 한다.
		Thread thread = new Thread(null, insertLogBackgroundThreadProcessing, "Background_insertLog");
		thread.start();
	}

	/* 화면이 닫히면 Database 를 닫는다.
	 * 
	 * @see android.app.Activity#onStop()
	 */
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();

//		if(groupDatabaseHandler != null) {
		//			groupDatabaseHandler.close();
		//		}
		
		// 만약 즐겨 찾기 상태가 변경 되었으면 업데이트 한다.
//		if(!(CATEGORY_FAVORITE_YN_CONPARE).equals(CATEGORY_FAVORITE_YN)) {
//			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_UPDATE));
//		}

//		if(categoryDatabaseHandler != null) {
//			categoryDatabaseHandler.close();
//		}
//		
//		if(itemDatabaseHandler != null) {
//			itemDatabaseHandler.close();
//		}
	}
	
	/* 최상위 프로세스가 아닐 경우 프로세스를 종료 한다.
	 * 
	 * => Home Key 를 눌렀을때 프로세스를 종료 한다.
	 * 
	 * @see android.app.Activity#onPause()
	 */
	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		
		if(!isForegrdound()) {
//			DayveCategoryView.DAYVE_FINISH_STATUS = true;
			DayveCategoryView.activity.finish();
			System.exit(0);
		}
	}
	
	/* 뒤로 가기 버튼을 터치하면 즐겨찾기 설정 상태를 체크해서
	 * 만약 변경 사항이 있으면 업데이트 한다.
	 * 
	 * @see android.app.Activity#onBackPressed()
	 */
	@Override
	public void onBackPressed() {
		// TODO Auto-generated method stub
		super.onBackPressed();
		
		// 만약 즐겨 찾기 상태가 변경 되었으면 업데이트 한다.
//		if(!(CATEGORY_FAVORITE_YN_CONPARE).equals(CATEGORY_FAVORITE_YN)) {
//			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_UPDATE));
//		}
	}

	/**
	 * 현재 프로세스가 최상위로 실행중인지 검사 한다.
	 * 
	 * true : 최상위
	 * 
	 * @return
	 */
	public boolean isForegrdound() {
	    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
	    List<RunningTaskInfo> list = am.getRunningTasks(1);
	    ComponentName cn = list.get(0).topActivity;
	    String name = cn.getPackageName();
	     
	    return name.indexOf(getPackageName()) > -1;
	}
	
	/**
	 * Database 에서 item 목록을 가져 와서 출력 한다.
	 * 
	 * 스크롤 이벤트에 의한 페이징 처리를 한다.
	 * 
	 * 분석 그래프를 출력 한다.
	 */
	private Runnable selectItemList = new Runnable() {

		public void run() {
			// TODO Auto-generated method stub
			Log.i(TAG, "selectItemList");
			
			
//			itemViewList = new ArrayList<DayveItem>();
			
			/**
			 * database 를 open 한다.
			 */
			itemDatabaseHandler = DayveItemDatabaseHandler.open(getApplicationContext());
			
			if(!analysisCategoryProgressBar.isShown()) {
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
			}
			
			String _id = "0";
			
			int listSize = itemViewList.size();
			
			if(listSize > 0 ) {
				_id = itemViewList.get(listSize-1).get_id();
			}
			
//			/**
//			 * 출력하기 직전 기존의 화면 목록을 지운다.
//			 */
//			itemViewList.clear();
			
//			ArrayList<DayveItem> resultList = itemDatabaseHandler.selectItemList(_id, "" + itemCount);
			ArrayList<DayveItem> resultList = itemDatabaseHandler.selectItemListForCategory(categoryId);
			
			itemViewList.addAll(resultList);
			
//			if(resultList.size() < itemCount || 1000 < itemViewList.size()) {
//				mLockListView = true;
//			} else {
//				mLockListView = false;
//			}
			
			Log.e(TAG, "itemViewList : " + itemViewList.size());
			
			/**
			 * 만약 리스트가 없으면(등록된 item  없으면) toast 를 띄우고, 
			 * 아니면 분석 그래프를 출력 한다.
			 */
			if(itemViewList.size() < 1) {
				showNoListToast();
			} else {
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_ALAYSIS_GRAPH_VISIBLE));
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_ALAYSIS_GRAPH));
			}
			
			dayveCategoryAnalysisAdapter.notifyDataSetChanged();

			// 스크롤 이벤트의 페이징 처리를 위한 처리를 한다.
//			requestCount++;
//			itemStart = requestCount * itemCount;
			
			itemDatabaseHandler.close();
			
			// 프로그레스 바를 감춘다.
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		}
		
	};

	/**
	 * 로그를 저장 한다.
	 */
	private void insertLog() {
		Log.i(TAG, "insertLog");
		
		DayveLog dayveLog = new DayveLog();
		
		dayveLog.setId(DAYVE_ID);
		dayveLog.setViewName(TAG);
		dayveLog.setAccessDate(currentDate);
		
		try {
			dayveCommonRest.registerLog(dayveLog);
			Log.i(TAG, "Success to insert log.");
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Log.e(TAG, "Fail to insert log.");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Log.e(TAG, "Fail to insert log.");
		}
	}
	
	/**
	 * 로그 저장은 UI 와 관계 없기 때문에 background thread 로 구현 함 : child thread
	 */
	private Runnable insertLogBackgroundThreadProcessing = new Runnable() {
		
		public void run() {
			// TODO Auto-generated method stub
			insertLog();
		}
	};
}
